Nacos & Spring Cloud
1. 概念
Nacos
这个名字是从Dynamic Naming and Configuration Service
的Naming & Configuration & Service
部分首字母结合得来
Nacos
是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台,主要面向的是微服务化的平台系统,以便提供一系列简单易用的特性
Nacos
支持以下系列特性:
- 服务发现和服务健康监测:基于DNS协议和RPC实现了服务发现,并且提供对服务的实时健康检查
- 动态配置服务:动态配置能够使得各个服务实时获取到自身最新的配置项,最大的优势是在毫秒级别内能够获取到最新的配置,并且服务无需重启即可应用,同时Nacos的DashBoard还提供了一系列服务配置相关的UI入口,比如配置版本变更,配置回滚等
- 动态DNS服务:支持针对服务的权重配置,能够基于此实现负载均衡,另一方面可以进行流量控制等
- 服务与元数据管理:能够获取和管理各个服务的状态,同时也能够获取和配置每个服务的元数据信息
- ……
2. 引入
Nacos
分为客户端和服务端,服务端充当了Nacos中心平台的角色,提供了上述所提到的重要特性,而客户端则是一个一个的服务,将自身服务注册至Nacos
中或者从Nacos
中心平台拉取对应属于自己服务的配置信息
目前Nacos最新版本为2.x,后续会逐步停止1.x版本的维护,因此目前使用主要是2.x版本为主
服务端搭建:可参考Nacos官网进行安装,需要注意的是Nacos官网提到的服务端搭建主要是以本地环境为主
客户端搭建:Nacos可以融合不同的生态,比如
Spring, Spring Boot, Spring Cloud, Dubbo
等等,可参照Nacos官网进行引入
3. 配置中心
Tips: 本文主要会采用Spring Cloud生态进行引入使用
a. 依赖
在成功启动Nacos
服务端后,客户端中引入以下nacos-config
依赖项
- Maven
1 | <dependency> |
- Gradle
1 | implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:{version}' |
Tips: 版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本,版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本
如果涉及到详细的版本对应关系,可以参考Nacos的版本说明
b. 客户端配置
完成以上依赖引入后,可前往application.yaml / bootstrap.properties
文件中进行以下配置:
1 | spring.cloud.nacos.config.server-addr=127.0.0.1:8848 |
配置spring.cloud.nacos.config.server-addr
是为了能够识别配置中心的地址,使其能够通过该地址获取有关该服务的动态配置项,而spring.application.name
则表示服务的名称,实际上也是Nacos会从服务端获取对应配置的标识之一(即Nacos配置管理中的dataId
组成的一部分字段)
c. 服务端创建配置
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
1 | ${prefix}-${spring.profiles.active}.${file-extension} |
Tips: 当
spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置,目前只支持properties
和yaml
类型
由上已知客户端配置的application.name
为nacosDemo
,同时我们没有设置profiles.active
属性,配置项为properties
的格式,因此可通过以下两种方式创建属于该服务的配置项:
- Nacos Open API
1 | // 创建配置项 |
- Nacos Dashboard
进入Nacos Dashboard后,前往ConfigManagement -> Configurations -> Create Configuration
进行配置的创建,如下所示:
d. 使用配置
在上述创建的nacosDemo
项目中初始化一个endpoint
用于直接获取配置项并返回,如下所示:
1 | import org.springframework.beans.factory.annotation.Value; |
通过调用该接口可以实时获取useLocalCache
的值为false
如果Nacos中useLocalCache
的值发生了变化,服务中的值也会实时刷新,其中实时刷新机制主要得益于Nacos支持了Spring Cloud原生的的@RefreshScope
注解
4. 服务注册与发现
a. 依赖
客户端中引入以下nacos-discovery
依赖项与open-feign
依赖项
- Maven
1 | <dependency> |
- Gradle
1 | implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' |
b. 服务注册
Tips: 默认配置中服务发现和配置中心的地址都为
127.0.0.1:8848
Nacos服务注册主要依赖spring.cloud.nacos.discovery.server-addr
确定Nacos服务端的地址,无需额外配置项
在服务中加入以上配置项后,前往Application
启动类中加入@EnableDiscoveryClient
注解用于启用服务发现功能
启动服务后,通过Nacos Dashboard -> ServiceManagement -> Service List
服务列表查看服务是否已经注册成功,如下所示
c. 服务发现
服务发现依赖的是Spring Cloud
的open-feign
组件,在使用@FeignClient
注解进行标识的同时,直接标识serviceName:port
作为对应Feign的名称即可由Nacos实现默认的服务发现与调用
对应nacosDemo
服务部署在8080端口,endpoint
代码如下所示:
1 |
|
nacosDemo1
服务部署在8081端口,endpoint
代码如下所示:
1 |
|
以上,通过访问nacosDemo
服务的8080端口请求/test
接口,即可调用nacosDemo1
的API实现服务发现
5. 相关链接
- Spring Initializer: https://start.spring.io/
- Cloud Native App Initializer: https://start.aliyun.com/
- Nacos 2.x Doc: https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html